home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / fish / 676-700 / 697 / qmouse / qmouse.s < prev    next >
Text File  |  1995-03-18  |  28KB  |  1,434 lines

  1. ;QMouse.s
  2. ;Written by Dan Babcock
  3.  
  4. ;Note: This source was assembled with Macro68. If you don't have Macro68
  5. ;(shame) it may be easily modified for other assemblers.
  6.  
  7.     exeobj
  8.     objfile    'c:QMouse'
  9.     multipass
  10.  
  11.     IFND    _LVOSystemTagList
  12. _LVOSystemTagList    equ    -$25E
  13.     ENDC
  14.  
  15. SCREENLISTSIZE    equ    32    ;maximum number of screens to keep track of
  16. POINTERLISTSIZE    equ    32
  17. HANDLERPRI    equ    60    ;priority of input.device handler
  18. MaxCopperSize    equ    500
  19.  
  20. SysBackground    equ    $e    ;Offset into gb_copinit copper list -- 2.04 only!
  21. DefColor    equ    $fff    ;white
  22.  
  23.     move.l    4,a6
  24.     cmp.w    #37,LIB_VERSION(a6)
  25.     bhs.s    GoodVersion
  26.  
  27. ;Print an error message - the user doesn't have 2.0
  28.     lea    DosName(pc),a1
  29.     SYS    OldOpenLibrary
  30.     tst.l    d0
  31.     beq.s    ErrEnd
  32.     move.l    d0,a6
  33.     SYS    Output
  34.     move.l    d0,d1
  35.     moveq    #EndSorry-Sorry,d3
  36.     lea    Sorry(pc),a0
  37.     move.l    a0,d2
  38.     SYS    Write
  39.     move.l    a6,a1
  40.     move.l    4,a6
  41.     SYS    CloseLibrary
  42. ErrEnd:    moveq    #100,d0
  43.     rts
  44.  
  45.     dc.b    '$VER: QMouse 2.10 (14.6.92)',$a,0
  46. Sorry:    dc.b    'Sorry, this program requires Kickstart 2.0!',$a,0
  47. EndSorry:    even
  48.  
  49. GoodVersion:
  50.  
  51. ;Allocate global data structure
  52.     move.l    #Data_Sizeof,d0
  53.     move.l    #MEMF_CLEAR,d1
  54.     SYS    AllocMem
  55.     tst.l    d0
  56.     beq    ErrEnd
  57.     move.l    d0,a5
  58.     lea    GlobalPtr(pc),a0
  59.     move.l    a5,(a0)
  60.  
  61. ;Allocate chip RAM data.
  62.     move.l    #CData_Sizeof,d0
  63.     move.l    #MEMF_CLEAR+MEMF_CHIP,d1
  64.     SYS    AllocMem
  65.     move.l    d0,ChipData(a5)
  66.     beq    CleanUp
  67.  
  68. ;Initialize static data
  69.     move.b    #HANDLERPRI,InputInterrupt+LN_PRI(a5)
  70.     move.l    a5,InputInterrupt+IS_DATA(a5)
  71.     moveq    #1,d0
  72.     move.l    d0,ClickCount(a1)
  73.  
  74. ;Open libraries
  75.     lea    LibTable(pc),a2
  76.     move.l    a2,a3
  77.     moveq    #NumLibs-1,d2
  78. .OLibLoop:
  79.     move.w    (a2)+,a1
  80.     add.l    a3,a1
  81.     SYS    OldOpenLibrary
  82.     move.w    (a2)+,a0
  83.     add.l    a5,a0
  84.     move.l    d0,(a0)
  85.     beq    CleanUp
  86.     dbra    d2,.OLibLoop
  87.  
  88. ;Parse command line
  89.     lea    Template(pc),a0
  90.     move.l    a0,d1
  91.     lea    Options(a5),a0
  92.     move.l    a0,d2
  93.     moveq    #0,d3    ;no custom rdarg structure
  94.     move.l    DosBase(a5),a6
  95.     SYS    ReadArgs
  96.     move.l    d0,ArgPtr(a5)
  97.     beq    CleanUp
  98.     move.l    4,a6
  99.  
  100. ;Process QUIT option, if selected.
  101.     tst.l    QuitOption(a5)
  102.     beq.s    .SkipQuit
  103.     lea    ProcName(pc),a1
  104.     SYS    FindTask
  105.     tst.l    d0
  106.     beq    CleanUp
  107.     move.l    d0,a1
  108.     move.l    TC_Userdata(a1),a0
  109.     move.l    QuitSig(a0),d0
  110.     SYS    Signal    ;tell task to quit
  111.     bsr    CleanUp
  112.     bra    .Exit
  113. .SkipQuit:
  114.  
  115. ;If already installed, kill the existing process.
  116.     lea    ProcName(pc),a1
  117.     SYS    FindTask
  118.     tst.l    d0
  119.     beq.s    .NotInstalled
  120.     move.l    d0,a1
  121.     move.l    TC_Userdata(a1),a0
  122.     move.l    QuitSig(a0),d0
  123.     SYS    Signal    ;tell task to quit
  124.  
  125.     moveq    #26,d2
  126. .Kill:    subq.l    #1,d2
  127.     beq    .Exit
  128.     move.l    DosBase(a5),a6
  129.     moveq    #2,d1
  130.     SYS    Delay
  131.     lea    ProcName(pc),a1
  132.     move.l    4,a6
  133.     SYS    FindTask
  134.     tst.l    d0
  135.     bne    .Kill
  136. .NotInstalled:
  137.  
  138. ;Get stack for command.
  139.     move.l    DosBase(a5),a6
  140.     SYS    Cli
  141.     move.l    d0,a0
  142.     move.l    cli_DefaultStack(a0),d0
  143.     lsl.l    #2,d0
  144.     lea    CmdStackSize(pc),a0
  145.     move.l    d0,(a0)
  146.     move.l    4,a6
  147.  
  148. ;Copy resident part of code into allocated memory
  149.     lea    StartAllocCode(pc),a0    ;source
  150.     lea    ResidentCode(a5),a1    ;destination
  151.     move.l    #ResidentCodeSize,d0    ;size
  152.     SYS    CopyMem
  153.     SYS    CacheClearU    ;for 020/030/040
  154.  
  155. ;Start a process
  156.     move.l    DosBase(a5),a6
  157.     lea    ResidentCode(a5),a0
  158.     lea    EntryPoint(pc),a1
  159.     move.l    a0,(a1)
  160.     lea    ProcName-StartAllocCode+ResidentCode(a5),a0
  161.     lea    ProcNamePtr(pc),a1
  162.     move.l    a0,(a1)
  163.     lea    NewProcTags(pc),a0
  164.     move.l    a0,d1
  165.     SYS    CreateNewProc
  166.  
  167. ;Exit back to CLI
  168. .Exit:    moveq    #0,d0
  169.     rts
  170.  
  171. ***************************************************************************
  172. * The following code is copied into allocated memory.                     *
  173. ***************************************************************************
  174.  
  175. StartAllocCode:
  176.     move.l    4,a6
  177.     move.l    GlobalPtr(pc),a5
  178.     lea    IntRoutine(pc),a0
  179.     move.l    a0,InputInterrupt+IS_CODE(a5)
  180.  
  181. ;Initialize damping constant.
  182.     move.l    AccelOption(a5),d0
  183.     beq.s    .NoDamp
  184.     move.l    d0,a0
  185.     move.l    (a0),d0
  186.     subq.l    #1,d0
  187.     move.l    ThreshOption(a5),d1
  188.     beq.s    .DefThresh
  189.     move.l    d1,a0
  190.     move.l    (a0),d1
  191. .DefThresh:
  192.     addq.l    #1,d1
  193.     mulu.w    d0,d1
  194.     move.w    d1,DampingConstant(a5)
  195. .NoDamp:
  196.  
  197. ;Allocate signals
  198.     moveq    #NumSigs-1,d2
  199.     lea    Sigs(a5),a2
  200. .SigLoop:    moveq    #-1,d0
  201.     SYS    AllocSignal
  202.     tst.l    d0
  203.     bmi    CleanUp
  204.     moveq    #0,d1
  205.     bset    d0,d1
  206.     move.l    d1,(a2)+
  207.     dbra    d2,.SigLoop
  208.  
  209. ;Initialize semaphore(s)
  210.     lea    MySemaphore(a5),a0
  211.     SYS    InitSemaphore
  212.  
  213.     move.l    ThisTask(a6),a0
  214.     move.l    a0,Task(a5)
  215.     move.l    a5,TC_Userdata(a0)
  216.  
  217. ;Install no-flicker option if selected.
  218.     tst.l    FlickerOption(a5)
  219.     beq.s    .NoFlicker
  220.     move.l    GraphBase(a5),a0
  221.     move.l    gb_CopInit(a0),a0
  222.     move.l    a0,OriginalCopInit(a5)
  223.     move.l    ChipData(a5),a1
  224.     lea    Copper(a1),a1
  225.     move.l    a1,a2
  226.     move.w    #MaxCopperSize/4-1,d0
  227. .CLoop:    move.l    (a0)+,d1
  228.     cmp.l    #$008A0000,d1
  229.     beq.s    .CopEnd
  230.     move.l    d1,(a1)+
  231.     dbra    d0,.CLoop
  232.     clr.l    FlickerOption(a5)
  233.     bra.s    .NoFlicker
  234. .CopEnd:    move.l    #$01800000,(a1)+
  235.     move.l    #$1607FFFE,(a1)+
  236.     move.w    #$0180,(a1)+
  237.     move.l    #$008A0000,2(a1)
  238.     move.l    a1,RealBackground(a5)
  239.     move.l    a2,cop1lc+_custom
  240.     move.l    GraphBase(a5),a0
  241.     move.l    a2,gb_CopInit(a0)
  242.     cmp.w    #color,SysBackground-2(a2)
  243.     bne.s    .DefColor
  244.     move.w    SysBackground(a2),(a1)
  245.     bra.s    .NoFlicker
  246. .DefColor:
  247.     move.w    #DefColor,(a1)
  248. .NoFlicker:
  249.  
  250. ;Patch MANY system routines.
  251.     lea    PatchTable(pc),a2
  252.     move.l    a2,a3
  253. .Patch:    move.w    (a2)+,d0    ;get base
  254.     beq.s    .EndPatch
  255.     move.l    (a5,d0.w),a1    ;library base to patch
  256.     move.w    (a2)+,d0    ;get offset to new routine
  257.     lea    (a3,d0.w),a0
  258.     move.l    a0,d0    ;new routine address
  259.     move.w    (a2)+,a0    ;_LVO offset
  260.     SYS    SetFunction
  261.     move.w    (a2)+,d1
  262.     move.l    d0,(a5,d1.w)
  263.     bra    .Patch
  264. .EndPatch:
  265.  
  266. ;Create an IORequest structure
  267.     SYS    CreateMsgPort
  268.     move.l    d0,InputMsgPort(a5)
  269.     beq    CleanUp
  270.     move.l    d0,a0
  271.     moveq    #IOSTD_SIZE,d0
  272.     SYS    CreateIORequest
  273.     move.l    d0,InputIORequest(a5)
  274.     beq    CleanUp
  275.  
  276. ;Perform NoClick, if desired.
  277.     move.l    NoClickOption(a5),d2
  278.     beq.s    .Click
  279.     move.l    d2,a0
  280.     move.l    (a0),d2
  281. .Click:    moveq    #0,d3
  282.     moveq    #3,d4
  283. .ClickLoop:
  284.     lea    TrackName(pc),a0    ;device name
  285.     move.l    d3,d0    ;unit number
  286.     move.l    InputIORequest(a5),a1    ;IO request
  287.     moveq    #0,d1    ;flags
  288.     SYS    OpenDevice
  289.     tst.l    d0
  290.     bne.s    .ECLoop
  291.     move.l    InputIORequest(a5),a1    ;IO request
  292.     move.l    IO_UNIT(a1),a0
  293.     btst    d3,d2
  294.     beq.s    .SkipNoClick
  295.     bchg    #TDPB_NOCLICK,TDU_PUBFLAGS(a0)
  296. .SkipNoClick:
  297.     tst.l    VerifyOption(a5)
  298.     beq.s    .SkipVerify
  299.     bchg    #1,TDU_PUBFLAGS(a0)
  300. .SkipVerify:
  301.     SYS    CloseDevice
  302. .ECLoop:    addq.l    #1,d3
  303.     dbra    d4,.ClickLoop
  304.  
  305. ;Handle 'STAR' option.
  306.     tst.l    StarOption(a5)
  307.     beq.s    .NoStar
  308.     move.l    DosBase(a5),a0
  309.     move.l    dl_Root(a0),a0
  310.     bchg    #0,rn_Flags(a0)
  311. .NoStar:
  312.  
  313. ;Open the input.device
  314.     lea    InputName(pc),a0    ;device name
  315.     moveq    #0,d0    ;unit number
  316.     move.l    InputIORequest(a5),a1    ;IO request
  317.     moveq    #0,d1    ;flags
  318.     SYS    OpenDevice
  319.     tst.l    d0
  320.     bne    CleanUp
  321.  
  322. ;Install input handler
  323.     move.l    InputIORequest(a5),a1
  324.     move.w    #IND_ADDHANDLER,IO_COMMAND(a1)
  325.     lea    InputInterrupt(a5),a0
  326.     move.l    a0,IO_DATA(a1)
  327.     SYS    DoIO
  328.     tst.l    d0
  329.     bne    CleanUp
  330.     st    HandlerInstalled(a5)
  331.  
  332. ;Wait for signal(s)
  333. Wait:
  334.     lea    Sigs(a5),a0
  335.     move.l    (a0)+,d0
  336.     moveq    #NumSigs-2,d1
  337. ..    add.l    (a0)+,d0
  338.     dbra    d1,..
  339.     move.l    4,a6
  340.     SYS    Wait
  341.     move.l    d0,d1
  342.     and.l    QuitSig(a5),d1
  343.     bne.s    SafeCleanUp
  344.     move.l    d0,d1
  345.     and.l    CLISig(a5),d1
  346.     bne.s    .Execute
  347.     move.l    d0,d1
  348.     and.l    WBenchToFrontSig(a5),d1
  349.     bne.s    .WBenchToFront
  350.  
  351. ;Perform ScreenToBack
  352.     move.l    IntBase(a5),a6
  353.     move.l    ScreenPtr(a5),d0
  354.     beq    Wait
  355.     clr.l    ScreenPtr(a5)
  356.     move.l    d0,a0
  357.     SYS    ScreenToBack
  358.     bra    Wait
  359. .WBenchToFront:
  360.     move.l    IntBase(a5),a6
  361.     SYS    WBenchToFront
  362.     bra    Wait
  363. .Execute:
  364. ;Execute the desired command
  365.     move.l    DosBase(a5),a6
  366.  
  367.     move.l    CmdOption(a5),d1
  368.     beq    Wait
  369.     lea    .Tags(pc),a0
  370.     move.l    a0,d2    ;tags
  371.     SYS    SystemTagList
  372.     bra    Wait
  373. .Tags:    dc.l    SYS_USERSHELL,0
  374.     dc.l    NP_StackSize
  375. CmdStackSize:
  376.     dc.l    0
  377.     dc.l    0    ;end of tag list
  378.  
  379. SafeCleanUp:
  380. ;Make sure the SetFunction'ed vectors are still intact.
  381.     lea    PatchTable(pc),a0
  382.     move.l    a0,a2
  383. .Safe:    move.w    (a0)+,d0
  384.     beq.s    CleanUp
  385.     move.l    (a5,d0.w),a1    ;library base
  386.     move.w    (a0)+,d0
  387.     lea    (a2,d0.w),a3    ;address of new routine
  388.     move.w    (a0)+,d0
  389.     cmp.l    2(a1,d0.w),a3
  390.     bne    Wait
  391.     addq.l    #2,a0
  392.     bra    .Safe
  393.  
  394. LibTable:    dc.w    DosName-LibTable
  395.     dc.w    DosBase
  396.     dc.w    IntName-LibTable
  397.     dc.w    IntBase
  398.     dc.w    LayersName-LibTable
  399.     dc.w    LayersBase
  400.     dc.w    GraphName-LibTable
  401.     dc.w    GraphBase
  402. EndLibTable:
  403.  
  404. NumLibs    equ    (EndLibTable-LibTable)/4
  405.  
  406. CleanUp:
  407.  
  408. ;Enter with global ptr in A5
  409.  
  410.     move.l    4,a6
  411.  
  412. ;Remove input handler, if installed.
  413.     tst.b    HandlerInstalled(a5)
  414.     beq.s    .SkipHand
  415.     move.l    InputIORequest(a5),a1
  416.     move.w    #IND_REMHANDLER,IO_COMMAND(a1)
  417.     lea    InputInterrupt(a5),a0
  418.     move.l    a0,IO_DATA(a1)
  419.     SYS    DoIO
  420. .SkipHand:
  421.  
  422.     tst.l    OldCloseScreen(a5)
  423.     beq.s    .SkipRestore
  424.  
  425.     bsr    RestoreMouse
  426.     bsr    RestoreScreen
  427.  
  428. ;Restore original vectors.
  429.  
  430.     lea    PatchTable(pc),a2
  431. .RestoreVecs:
  432.     move.w    (a2),d0
  433.     beq.s    .SkipRestore
  434.     addq.l    #4,a2    ;skip new routine info
  435.     move.l    (a5,d0.w),a1    ;get library base
  436.     move.w    (a2)+,a0    ;get _LVO
  437.     move.w    (a2)+,d0
  438.     move.l    (a5,d0.w),d0    ;old routine
  439.     SYS    SetFunction
  440.     bra    .RestoreVecs
  441. .SkipRestore:
  442.  
  443. ;Delay for 1/10 second to ensure that no-one is using the patch code.
  444.     move.l    DosBase(a5),d0
  445.     beq.s    .SkipFreeArg
  446.     move.l    d0,a6
  447.     moveq    #5,d1
  448.     SYS    Delay
  449.  
  450. ;Free argument structure
  451.     move.l    ArgPtr(a5),d1
  452.     beq.s    .SkipFreeArg
  453.     SYS    FreeArgs
  454. .SkipFreeArg:
  455.  
  456.     move.l    4,a6
  457.  
  458. ;Free signals
  459.     lea    Sigs(a5),a2
  460.     moveq    #NumSigs-1,d2
  461. .SigLoop:    move.l    (a2)+,d1
  462.     beq.s    .NextSig
  463.     moveq    #-1,d0
  464. .BitLoop:    addq.l    #1,d0
  465.     btst    d0,d1
  466.     beq    .BitLoop
  467.     SYS    FreeSignal
  468. .NextSig:    dbra    d2,.SigLoop
  469.  
  470. ;Remove flicker option, if selected.
  471.     tst.l    FlickerOption(a5)
  472.     beq.s    .SkipFlicker
  473.     move.l    OriginalCopInit(a5),a0
  474.     move.l    GraphBase(a5),a2
  475.     move.l    gb_CopInit(a2),a1
  476. .CLoop:    move.l    (a1)+,(a0)+
  477.     cmp.l    #$008A0000,(a0)
  478.     bne    .CLoop
  479.     move.l    OriginalCopInit(a5),gb_CopInit(a2)
  480.     move.l    OriginalCopInit(a5),cop1lc+_custom
  481. .SkipFlicker:
  482.  
  483. ;Close libraries
  484.     lea    LibTable+2(pc),a2
  485.     moveq    #NumLibs-1,d2
  486. .CLibLoop:
  487.     move.w    (a2),a0
  488.     add.l    a5,a0
  489.     tst.l    (a0)
  490.     beq.s    .SkipClose
  491.     move.l    (a0),a1
  492.     SYS    CloseLibrary
  493. .SkipClose:
  494.     addq.l    #4,a2
  495.     dbra    d2,.CLibLoop
  496.  
  497. ;Close input.device
  498.     move.l    InputIORequest(a5),d0
  499.     beq.s    .SkipCloseDev
  500.     move.l    d0,a1
  501.     tst.b    IO_ERROR(a1)    ;was there an error?
  502.     bne.s    .SkipCloseDev    ;yes, don't close
  503.     SYS    CloseDevice
  504. .SkipCloseDev:
  505.  
  506. ;Delete IORequest structure
  507.     move.l    InputIORequest(a5),a0
  508.     SYS    DeleteIORequest
  509.     move.l    InputMsgPort(a5),a0
  510.     SYS    DeleteMsgPort
  511.  
  512. ;Free chip data.
  513.     move.l    ChipData(a5),d0
  514.     beq.s    .SkipChipData
  515.     move.l    d0,a1
  516.     move.l    #CData_Sizeof,d0
  517.     SYS    FreeMem
  518. .SkipChipData:
  519.  
  520. ;Deallocate global structure. Note that this code is (sometimes) executed
  521. ;within the memory that we are freeing, so we are careful to terminate with
  522. ;a JMP.
  523.     move.l    a5,a1
  524.     move.l    #Data_Sizeof,d0
  525.     jmp    _LVOFreeMem(a6)
  526.  
  527. ;Semaphore routines
  528.  
  529. GetSemaphore:
  530.     movem.l    a0/a6,-(sp)
  531.     move.l    GlobalPtr(pc),a0
  532.     lea    MySemaphore(a0),a0
  533.     move.l    4,a6
  534.     SYS    ObtainSemaphore
  535.     movem.l    (sp)+,a0/a6
  536.     rts
  537. FreeSemaphore:
  538.     movem.l    a0/a6,-(sp)
  539.     move.l    GlobalPtr(pc),a0
  540.     lea    MySemaphore(a0),a0
  541.     move.l    4,a6
  542.     SYS    ReleaseSemaphore
  543.     movem.l    (sp)+,a0/a6
  544.     rts
  545.  
  546. ;****************** SetFunction'ed routines ***************
  547.  
  548. patch    macro
  549.     dc.w    \1
  550.     dc.w    New\2-PatchTable
  551.     dc.w    _LVO\2
  552.     dc.w    Old\2
  553.     endm
  554.  
  555. PatchTable:
  556.     patch    IntBase,CloseScreen
  557.     patch    IntBase,CloseWindow
  558.     patch    IntBase,OpenScreen
  559.     patch    IntBase,ScreenToFront
  560.     patch    IntBase,ScreenToBack
  561.     patch    IntBase,OpenScreenTagList
  562.     patch    IntBase,WBenchToFront
  563.     patch    IntBase,WBenchToBack
  564.     patch    IntBase,SetPointer
  565.     patch    IntBase,ClearPointer
  566.     patch    IntBase,DisplayBeep
  567.     patch    GraphBase,LoadView
  568.     dc.w    0
  569.  
  570. NewDisplayBeep:
  571.     move.l    GlobalPtr(pc),a1
  572.     tst.l    BeepOption(a1)
  573.     bne.s    .SkipBeep
  574.     move.l    OldDisplayBeep(a1),-(sp)
  575. .SkipBeep:
  576.     rts
  577.  
  578. NewSetPointer:
  579.     bsr    GetSemaphore
  580.     movem.l    d4-d5/a2-a3/a5,-(sp)
  581.     move.l    GlobalPtr(pc),a5
  582.     lea    PointerList(a5),a2
  583.  
  584. ;Find if window is already in table and find empty spot.
  585.     moveq    #POINTERLISTSIZE-1,d4
  586.     sub.l    a3,a3
  587. .WinSearch:
  588.     move.l    pt_Window(a2),d5
  589.     bne.s    .SkipSave
  590.     move.l    a2,a3
  591. .SkipSave:
  592.     cmp.l    d5,a0
  593.     beq.s    .Found
  594.     lea    pt_Sizeof(a2),a2
  595.     dbra    d4,.WinSearch
  596.     move.l    a3,a2
  597.     move.l    a2,d4
  598.     beq.s    .End    ;no room in table, so forget it
  599. .Found:    movem.l    d0-d3/a0-a1,(a2)
  600. .End:    cmp.l    MBlankWindow(a5),a0
  601.     beq.s    .End1
  602. .SkipMBlank:
  603.     movem.l    (sp)+,d4-d5/a2-a3/a5
  604.     subq.l    #8,sp
  605.     move.l    a0,(sp)
  606.     move.l    GlobalPtr(pc),a0
  607.     move.l    OldSetPointer(a0),4(sp)
  608.     move.l    (sp)+,a0
  609.     bsr    FreeSemaphore
  610.     rts
  611. .End1:    movem.l    (sp)+,d4-d5/a2-a3/a5
  612.     bsr    FreeSemaphore
  613.     rts
  614.  
  615. NewClearPointer:
  616.     bsr    GetSemaphore
  617.     move.l    GlobalPtr(pc),a1
  618.     lea    PointerList(a1),a1
  619.     moveq    #POINTERLISTSIZE-1,d0
  620. .ClearLoop:
  621.     cmp.l    pt_Window(a1),a0
  622.     beq.s    .Found
  623.     lea    pt_Sizeof(a1),a1
  624.     dbra    d0,.ClearLoop
  625.     bra.s    .End
  626. .Found:    clr.l    pt_Window(a1)
  627. .End:    move.l    GlobalPtr(pc),a1
  628.     cmp.l    MBlankWindow(a1),a0
  629.     beq.s    .End1
  630. .SkipMBlank:
  631.     move.l    OldClearPointer(a1),-(sp)
  632. .End1:    bsr    FreeSemaphore
  633.     rts
  634.  
  635. NewLoadView:
  636.     pea    .NewLoad(pc)
  637.     move.l    GlobalPtr(pc),a0
  638.     move.l    OldLoadView(a0),-(sp)
  639.     rts
  640. .NewLoad:
  641.     move.l    GlobalPtr(pc),a0
  642.     tst.l    FlickerOption(a0)
  643.     beq.s    .End
  644.     move.l    RealBackground(a0),a1
  645.     move.l    GraphBase(a0),a0
  646.     move.l    gb_copinit(a0),a0
  647.     move.w    SysBackground(a0),(a1)
  648. .End:    rts
  649.  
  650. NewCloseScreen:
  651.     bsr    GetSemaphore
  652.     move.l    GlobalPtr(pc),a1
  653.     lea    ScreenList(a1),a1
  654.     moveq    #SCREENLISTSIZE-1,d0
  655. .Loop:    cmp.l    (a1),a0
  656.     beq.s    .Match
  657.     addq.l    #8,a1
  658.     dbra    d0,.Loop
  659. .End:    move.l    GlobalPtr(pc),a1
  660.     pea    RestoreWindow(pc)
  661.     move.l    OldCloseScreen(a1),-(sp)
  662.     bsr    FreeSemaphore
  663.     rts
  664. .Match:    clr.l    (a1)
  665.     bra    .End
  666.  
  667. NewCloseWindow:
  668.     bsr    GetSemaphore
  669.     push    a0
  670.     SYS    ClearPointer
  671.     pop    a0
  672.     move.l    GlobalPtr(pc),a1
  673.     cmp.l    MBlankWindow(a1),a0
  674.     bne.s    .SkipClear
  675.     clr.l    MBlankWindow(a1)
  676. .SkipClear:
  677.     lea    ScreenList+4(a1),a1
  678.     moveq    #SCREENLISTSIZE-1,d0
  679. .Loop:    cmp.l    (a1),a0
  680.     beq.s    .Match
  681.     addq.l    #8,a1
  682.     dbra    d0,.Loop
  683. .End:    move.l    GlobalPtr(pc),a1
  684.     move.l    OldCloseWindow(a1),-(sp)
  685.     bsr    FreeSemaphore
  686.     rts
  687. .Match:    clr.l    -4(a1)
  688.     bra    .End
  689.  
  690. MyRemember:
  691.     bsr    GetSemaphore
  692.     bsr.s    RememberWindow
  693.     move.l    a0,-(sp)
  694.     move.l    GlobalPtr(pc),a0
  695.     move.l    (a0,d0.w),d0
  696.     move.l    (sp)+,a0
  697.     move.l    d0,-(sp)
  698.     bsr    FreeSemaphore
  699.     rts
  700.  
  701. NewOpenScreen:
  702.     move.w    #OldOpenScreen,d0
  703.     bra    MyRemember
  704. NewOpenScreenTagList:
  705.     move.w    #OldOpenScreenTagList,d0
  706.     bra    MyRemember
  707. NewWBenchToFront:
  708.     move.w    #OldWBenchToFront,d0
  709.     bsr    MyRemember
  710.     bra.s    RestoreWindow
  711. NewWBenchToBack:
  712.     move.w    #OldWBenchToBack,d0
  713.     bsr    MyRemember
  714.     bra.s    RestoreWindow
  715. NewScreenToFront:
  716.     move.w    #OldScreenToFront,d0
  717.     bsr    MyRemember
  718.     bra.s    RestoreWindow
  719. NewScreenToBack:
  720.     move.w    #OldScreenToBack,d0
  721.     bsr    MyRemember
  722.     bra.s    RestoreWindow
  723.  
  724. ;****************** End of SetFunction'ed routines ***************
  725.  
  726. RememberWindow:
  727.  
  728. ;This routine remembers the currently activated window on the current
  729. ;screen.
  730.  
  731.     movem.l    d0-d1/a0-a2/a4-a6,-(sp)
  732.     move.l    GlobalPtr(pc),a5
  733.     move.l    IntBase(a5),a4
  734.     move.l    4,a6
  735.     SYS    Forbid
  736.     move.l    ib_ActiveScreen(a4),a0
  737.     move.l    ib_ActiveWindow(a4),a2
  738.     SYS    Permit
  739.  
  740. ;Sanity checks
  741.     move.l    a0,d0
  742.     beq.s    .End
  743.     move.l    a2,d0
  744.     beq.s    .End
  745.  
  746.     lea    ScreenList(a5),a1
  747.     moveq    #SCREENLISTSIZE-1,d0
  748. .ScLoop:    cmp.l    (a1),a0
  749.     beq.s    .Match
  750.     addq.l    #8,a1
  751.     dbra    d0,.ScLoop
  752.  
  753. ;Screen not found. Add to screen list.
  754.     lea    ScreenList(a5),a1
  755.     moveq    #SCREENLISTSIZE-1,d0
  756. .AddLoop:    tst.l    (a1)
  757.     beq.s    .Match
  758.     addq.l    #8,a1
  759.     dbra    d0,.AddLoop
  760.     bra.s    .End    ;table is full
  761. .Match:
  762.     move.l    a0,(a1)+    ;screen
  763.     move.l    a2,(a1)    ;currently activated window
  764. .End:    movem.l    (sp)+,d0-d1/a0-a2/a4-a6
  765.     rts
  766.  
  767. RestoreWindow:
  768.  
  769. ;This routine restores (re-activates) the previously activated window for
  770. ;this screen.
  771.  
  772.     bsr    GetSemaphore
  773.     movem.l    d0-d1/a0-a1/a6,-(sp)
  774.     move.l    GlobalPtr(pc),a0
  775.     lea    ScreenList(a0),a1
  776.     move.l    IntBase(a0),a6
  777.     move.l    ib_FirstScreen(a6),a0
  778.     move.l    a0,d0
  779.     beq.s    .End    ;sanity check
  780.     moveq    #SCREENLISTSIZE-1,d0
  781. .Loop:    cmp.l    (a1),a0
  782.     beq.s    .Match
  783.     addq.l    #8,a1
  784.     dbra    d0,.Loop
  785.     move.l    sc_FirstWindow(a0),a0    ;default window
  786.     move.l    a0,d0
  787.     beq.s    .End    ;sanity check
  788.     bra.s    .SkipMatch
  789. .Match:
  790.     move.l    4(a1),a0
  791. .SkipMatch:
  792.     SYS    ActivateWindow
  793. .End:    movem.l    (sp)+,d0-d1/a0-a1/a6
  794.     bsr    FreeSemaphore
  795.     rts
  796.  
  797. ;***************************************************************************
  798. ;Start of input handler code
  799. ;***************************************************************************
  800.  
  801. ;Get window associated with current mouse position.
  802. ;Returns Window in D0 and screen in D1.
  803.  
  804. GetWindow:
  805.     movem.l    d2-d4/a0-a1/a4-a6,-(sp)
  806.     move.l    GlobalPtr(pc),a5
  807.     move.l    LayersBase(a5),a6
  808.     move.l    IntBase(a5),a4
  809.     move.l    ib_FirstScreen(a4),d4
  810. .ScLoop:    tst.l    d4
  811.     beq.s    .ErrEnd
  812.     move.l    d4,a0
  813.     move.l    sc_NextScreen(a0),d4
  814.     move.w    ib_MouseX(a4),d0
  815.     move.w    ib_MouseY(a4),d1
  816.     move.w    sc_ViewPort+vp_Modes(a0),d2
  817.     move.w    d2,d3
  818.     and.w    #V_LACE,d2    ;interlace?
  819.     bne.s    .Lace    ;yes
  820.     lsr.w    #1,d1
  821. .Lace:    and.w    #V_HIRES,d3    ;hires?
  822.     bne.s    .Hires    ;yes
  823.     lsr.w    #1,d0
  824. .Hires:    sub.w    sc_ViewPort+vp_DxOffset(a0),d0
  825.     bmi.s    .ScLoop
  826.     sub.w    sc_ViewPort+vp_DyOffset(a0),d1
  827.     bmi.s    .ScLoop
  828.     push    a0
  829.     lea    sc_LayerInfo(a0),a0
  830.     SYS    WhichLayer
  831.     pop    d1
  832.     tst.l    d0
  833.     beq.s    .End
  834.     move.l    d0,a0
  835.     move.l    lr_Window(a0),d0
  836. .End:    movem.l    (sp)+,d2-d4/a0-a1/a4-a6
  837.     rts
  838. .ErrEnd:    moveq    #0,d0
  839.     moveq    #0,d1
  840.     bra    .End
  841.  
  842. DoWindowToFront:
  843.  
  844. ;Perform a WindowToFront on the window in D0.
  845. ;Enter with global ptr in A1.
  846.  
  847.     tst.l    d0
  848.     beq.s    .End1
  849.     movem.l    d0-d1/a0-a1/a6,-(sp)
  850.     move.l    IntBase(a1),a6
  851.     move.l    d0,a0
  852.     move.l    wd_WLayer(a0),a1
  853.     move.l    a1,d0
  854.     beq.s    .End
  855.     move.l    lr_ClipRect(a1),a1
  856.     move.l    a1,d0
  857.     beq.s    .End
  858.     tst.l    (a1)
  859.     beq.s    .End
  860.     move.l    wd_Flags(a0),d0
  861.     and.l    #WFLG_BACKDROP,d0
  862.     bne.s    .End
  863.     SYS    WindowToFront
  864. .End:    movem.l    (sp)+,d0-d1/a0-a1/a6
  865. .End1:    rts
  866.  
  867. BlankMouse:
  868.     movem.l    d0-d3/a0-a1/a5-a6,-(sp)
  869.     move.l    GlobalPtr(pc),a5
  870.     move.l    IntBase(a5),a6
  871.     move.l    ib_ActiveWindow(a6),d0
  872.     beq.s    .End
  873.     cmp.l    MBlankWindow(a5),d0
  874.     beq.s    .End
  875.     move.l    d0,MBlankWindow(a5)
  876.     move.l    d0,a0
  877.     move.l    ChipData(a5),a1
  878. ;    lea    ZeroMouse(a1),a1    ;not needed
  879.     moveq    #1,d0    ;height
  880.     moveq    #16,d1    ;width
  881.     moveq    #0,d2    ;xoffset
  882.     moveq    #0,d3    ;yoffset
  883.     pea    .End(pc)
  884.     move.l    OldSetPointer(a5),-(sp)
  885.     rts
  886. .End:    movem.l    (sp)+,d0-d3/a0-a1/a5-a6
  887.     rts
  888.  
  889. RestoreMouse:
  890.     movem.l    d0-d1/a0-a2/a5-a6,-(sp)
  891.     move.l    GlobalPtr(pc),a5
  892.     move.l    IntBase(a5),a6
  893.     move.l    MBlankWindow(a5),d0
  894.     beq.s    .End
  895.  
  896. ;Look for window in pointer table. If present, do a SetPointer to restore
  897. ;the custom pointer. Otherwise call ClearPointer.
  898.  
  899.     move.l    d0,a0
  900.     clr.l    MBlankWindow(a5)
  901.     lea    PointerList(a5),a1
  902.     moveq    #POINTERLISTSIZE-1,d0
  903. .WinLoop:    cmp.l    pt_Window(a1),a0
  904.     beq.s    .Found
  905.     lea    pt_Sizeof(a1),a1
  906.     dbra    d0,.WinLoop
  907.     pea    .End(pc)
  908.     move.l    OldClearPointer(a5),-(sp)
  909.     rts
  910. .End:    movem.l    (sp)+,d0-d1/a0-a2/a5-a6
  911.     rts
  912. .Found:    move.l    a1,a2
  913.     movem.l    (a2),d0-d3/a0-a1
  914.     pea    .End(pc)
  915.     move.l    OldSetPointer(a5),-(sp)
  916.     rts
  917.  
  918. RestoreScreen:
  919.     push    a5
  920.     move.l    GlobalPtr(pc),a5
  921.     bclr    #STB_SBlanked,Status(a5)
  922.     beq.s    .End
  923.     move.w    #DMAF_SETCLR+DMAF_COPPER+DMAF_RASTER,dmacon+_custom
  924. .End:    pop    a5
  925.     rts
  926.  
  927. SigTask:
  928. ;Enter with GlobalPtr in A1 and signal in D0.
  929.     movem.l    d0-d1/a0-a1/a6,-(sp)
  930.     move.l    Task(a1),a1
  931.     move.l    4,a6
  932.     SYS    Signal
  933.     movem.l    (sp)+,d0-d1/a0-a1/a6
  934.     rts
  935.  
  936. IntRoutine:
  937.     movem.l    a2/a6,-(sp)
  938.     move.l    IntBase(a1),a6
  939.     bsr    GetSemaphore
  940.     move.l    a0,-(sp)
  941.     tst.l    FlickerOption(a1)
  942.     beq.s    .SkipFlick
  943.     move.l    GraphBase(a1),a0
  944.     move.l    gb_copinit(a0),a0
  945.     cmp.w    #color,Sysbackground-2(a0)
  946.     bne.s    .DefColor
  947.     move.w    SysBackground(a0),d0
  948.     move.l    RealBackground(a1),a0
  949.     move.w    d0,(a0)
  950.     bra.s    .SkipColor
  951. .DefColor:
  952.     move.l    RealBackground(a1),a0
  953.     move.w    #DefColor,(a0)
  954. .SkipColor:
  955.     move.l    (sp),a0
  956. .SkipFlick:
  957.  
  958. ;Perform SunMouse
  959.     tst.l    SunMouseOption(a1)
  960.     beq.s    .SkipSunMouse1
  961.     cmp.b    #IECLASS_RAWMOUSE,ie_Class(a0)
  962.     beq.s    .SkipSunMouse1
  963.     bclr    #STB_SunMouse,Status(a1)
  964.     beq.s    .SkipSunMouse1
  965.     bsr    GetWindow
  966.     movem.l    a0-a1,-(sp)
  967.     move.l    d0,a0
  968.     cmp.l    ib_ActiveWindow(a6),a0
  969.     beq.s    .EndSun
  970.     SYS    ActivateWindow
  971. .EndSun:    movem.l    (sp)+,a0-a1
  972. .SkipSunMouse1:
  973.  
  974.     move.l    MBlankWindow(a1),d0
  975.     beq.s    .Loop
  976.     cmp.l    ib_ActiveWindow(a6),d0
  977.     beq.s    .EndMBW
  978.     bsr    RestoreMouse
  979.     bsr    BlankMouse
  980. .EndMBW:
  981.  
  982. .Loop:    cmp.b    #IECLASS_TIMER,ie_Class(a0)
  983.     beq    .NotKey
  984.  
  985. ;Reset screen blank
  986.     tst.l    SBlankOption(a1)
  987.     beq.s    .SkipSRestore
  988.     move.l    ie_TimeStamp(a0),ScreenTime(a1)
  989.     bsr    RestoreScreen
  990. .SkipSRestore:
  991.  
  992.     cmp.b    #IECLASS_RAWKEY,ie_Class(a0)
  993.     bne    .NotKey
  994.     tst.b    ie_Code+1(a0)
  995.     bmi    .Next    ;ignore up key codes
  996.  
  997. ;Do Northgate keyboard mapping.
  998.     tst.l    NorthGateOption(a1)
  999.     beq.s    .SkipNorthgate
  1000.     lea    NorthgateTable(pc),a2
  1001.     move.w    ie_Code(a0),d0
  1002.     bclr    #7,d0
  1003. .NorthgateLoop:
  1004.     move.b    (a2),d1
  1005.     beq.s    .EndNorthgate
  1006.     addq.l    #3,a2
  1007.     cmp.b    d0,d1
  1008.     bne.s    .NorthgateLoop
  1009.     and.w    #$80,ie_Code(a0)
  1010.     move.b    -2(a2),d0
  1011.     or.b    d0,ie_Code+1(a0)
  1012.     move.b    -1(a2),d0
  1013.     bmi.s    .EndNorthgate
  1014.     bset    d0,ie_Qualifier+1(a0)
  1015. .EndNorthgate:
  1016. .SkipNorthgate:
  1017.  
  1018.     btst    #IEQUALIFIERB_LCOMMAND,ie_Qualifier+1(a0)
  1019.     bne    .DoLAmiga
  1020.  
  1021. ;Blank mouse pointer
  1022.     tst.l    MBlankOption(a1)
  1023.     beq.s    .NoMBlank
  1024.     bsr    BlankMouse
  1025. .NoMBlank:
  1026.     bra    .Next
  1027.  
  1028. .DoLAmiga:
  1029.     cmp.w    #$37,ie_Code(a0)    ;'m'?
  1030.     bne.s    .NotM
  1031.  
  1032. ;We found an Amiga-M. Defuse and perform action.
  1033.     clr.b    ie_Class(a0)
  1034.     move.l    ib_FirstScreen(a6),a0
  1035.     move.l    a0,d0
  1036.     beq    .EndM    ;sanity check
  1037.     move.l    a0,ScreenPtr(a1)
  1038.     move.l    ScreenToBackSig(a1),d0
  1039.     bsr    SigTask
  1040. .EndM:    bra    .End
  1041. .NotM:
  1042.     cmp.w    #$36,ie_Code(a0)    ;'n'?
  1043.     bne.s    .NotN
  1044.  
  1045. ;We found an Amiga-N. Defuse and perform action.
  1046.     clr.b    ie_Class(a0)
  1047.     move.l    WBenchToFrontSig(a1),d0
  1048.     bsr    SigTask
  1049.     bra    .End
  1050. .NotN:
  1051.     tst.l    CmdOption(a1)
  1052.     beq    .Next
  1053.     cmp.w    #$45,ie_Code(a0)    ;ESC?
  1054.     bne    .Next
  1055.     clr.b    ie_Class(a0)
  1056.     move.l    CLISig(a1),d0
  1057.     bsr    SigTask
  1058.     bra    .End
  1059.  
  1060. .NotKey:
  1061.     move.w    ib_MouseX(a6),d0
  1062.     move.w    ib_MouseY(a6),d1
  1063.     cmp.b    #IECLASS_RAWMOUSE,ie_Class(a0)
  1064.     beq    .DoMouse
  1065.     cmp.w    CurrentX(a1),d0
  1066.     bne    .DoMouse
  1067.     cmp.w    CurrentY(a1),d1
  1068.     beq    .Next
  1069.  
  1070. .DoMouse:
  1071.     move.w    d0,CurrentX(a1)
  1072.     move.w    d1,CurrentY(a1)
  1073.     tst.l    MBlankOption(a1)
  1074.     beq.s    .NoRestore
  1075.     move.l    ie_TimeStamp(a0),MouseTime(a1)
  1076.     bsr    RestoreMouse
  1077. .NoRestore:
  1078.  
  1079. ;Perform SunMouse
  1080.     tst.l    SunMouseOption(a1)
  1081.     beq.s    .SkipSunMouse
  1082.     move.w    ie_Qualifier(a0),d0
  1083.     and.w    #IEQUALIFIER_LEFTBUTTON+IEQUALIFIER_RBUTTON+IEQUALIFIER_MIDBUTTON,d0
  1084.     bne.s    .SkipSunMouse
  1085.     cmp.w    #IECODE_LBUTTON+IECODE_UP_PREFIX,ie_Code(a0)
  1086.     beq.s    .SkipSunMouse
  1087.     bset    #STB_SunMouse,Status(a1)
  1088. .SkipSunMouse:
  1089.  
  1090. ;Perform click-to-back.
  1091.     tst.l    CTBOption(a1)
  1092.     beq.s    .NoCTB
  1093.     cmp.w    #IECODE_RBUTTON,ie_Code(a0)
  1094.     bne.s    .NoCTB
  1095.     move.w    ie_Qualifier(a0),d0
  1096.     btst    #IEQUALIFIERB_LEFTBUTTON,d0
  1097.     beq.s    .NoCTB
  1098.  
  1099.     movem.l    d2/a0-a1,-(sp)
  1100.     bsr    GetWindow
  1101.     tst.l    d0
  1102.     beq.s    .FlipScreen
  1103.     move.l    d0,a1
  1104.     move.l    wd_Flags(a1),d2
  1105.     and.l    #WFLG_BACKDROP,d2
  1106.     bne.s    .FlipScreen
  1107.  
  1108. ;Is this the only window on this screen, except for backdrop windows?
  1109.     move.l    wd_WScreen(a1),a1
  1110.     move.l    sc_FirstWindow(a1),a1
  1111. .BackLoop:
  1112.     cmp.l    a1,d0
  1113.     beq.s    .EBackLoop
  1114.     move.l    wd_Flags(a1),d2
  1115.     and.l    #WFLG_BACKDROP,d2
  1116.     beq.s    .FlipWindow
  1117. .EBackLoop:
  1118.     move.l    (a1),a1
  1119.     move.l    a1,d2
  1120.     bne    .BackLoop
  1121. .FlipScreen:
  1122.     tst.l    d1
  1123.     beq.s    .ECTB
  1124.     move.l    GlobalPtr(pc),a1
  1125.     move.l    d1,ScreenPtr(a1)
  1126.     move.l    ScreenToBackSig(a1),d0
  1127.     bsr    SigTask
  1128.     bra.s    .ECTB
  1129. .FlipWindow:
  1130.     move.l    d0,a0
  1131.     SYS    WindowToBack
  1132.  
  1133. .ECTB:    movem.l    (sp)+,d2/a0-a1
  1134.     clr.b    ie_Class(a0)
  1135.     bra    .Next
  1136. .NoCTB:
  1137.  
  1138. ;Perform click-to-front.
  1139.     tst.l    CTFOption(a1)
  1140.     beq    .NoCTF
  1141.     cmp.w    #IECODE_LBUTTON,ie_Code(a0)
  1142.     bne    .NoCTF
  1143.     bsr    GetWindow
  1144.     tst.l    d0
  1145.     beq    .NoCTF
  1146.     move.l    CTFOption(a1),a2
  1147.     move.l    (a2),d1
  1148.     cmp.l    #1,d1
  1149.     bhi.s    .MoreThanOne
  1150.     bsr    DoWindowToFront
  1151.     bra.s    .NoCTF
  1152. .MoreThanOne:
  1153.     cmp.l    ClickWindow(a1),d0
  1154.     beq.s    .SameWindow
  1155.     move.l    d0,ClickWindow(a1)
  1156.     moveq    #1,d0
  1157.     move.l    d0,ClickCount(a1)
  1158. .Time:    move.l    ie_TimeStamp+TV_SECS(a0),ClickTime+TV_SECS(a1)
  1159.     move.l    ie_TimeStamp+TV_MICRO(a0),ClickTime+TV_MICRO(a1)
  1160.     bra.s    .NoCTF
  1161. .SameWindow:
  1162.  
  1163. ;Check to see whether MaxClickDelay has been exceeded. If not, increment
  1164. ;ClickCount and compare with (CTFOption). If equal, do a WindowToFront.
  1165. ;Window under pointer in D0.
  1166.  
  1167.     push    d0
  1168.     movem.l    d2-d3/a0-a1,-(sp)
  1169.     move.l    ClickTime+TV_SECS(a1),d0
  1170.     move.l    ClickTime+TV_MICRO(a1),d1
  1171.     move.l    ie_TimeStamp+TV_SECS(a0),d2
  1172.     move.l    ie_TimeStamp+TV_MICRO(a0),d3
  1173.     SYS    DoubleClick
  1174.     movem.l    (sp)+,d2-d3/a0-a1
  1175.     tst.l    d0
  1176.     beq.s    .TimeExceeded
  1177.     addq.l    #1,ClickCount(a1)
  1178.     push    a0
  1179.     move.l    CTFOption(a1),a0
  1180.     move.l    (a0),d0
  1181.     pop    a0
  1182.     cmp.l    ClickCount(a1),d0
  1183.     bhi.s    .NeedMoreClicks
  1184.     clr.l    ClickCount(a1)
  1185.     pop    d0
  1186.     bsr    DoWindowToFront
  1187.     bra.s    .NoCTF
  1188. .TimeExceeded:
  1189.     moveq    #1,d0
  1190.     move.l    d0,ClickCount(a1)
  1191. .NeedMoreClicks:
  1192.     pop    d0
  1193.     bra    .Time
  1194. .NoCTF:
  1195.  
  1196. ;Perform acceleration.
  1197.     tst.l    AccelOption(a1)
  1198.     beq.s    .Next
  1199.  
  1200.     moveq    #0,d0
  1201.     tst.l    ThreshOption(a1)
  1202.     beq.s    .T1
  1203.     move.l    ThreshOption(a1),a2
  1204.     move.l    (a2),d0
  1205. .T1:    move.w    ie_X(a0),d1
  1206.     bpl.s    .PosX
  1207.     neg.w    d1
  1208. .PosX:    cmp.w    d0,d1
  1209.     bls.s    .SkipX    ;below threshold
  1210.     move.l    AccelOption(a1),a2
  1211.     move.l    (a2),d1
  1212.     muls.w    ie_X(a0),d1
  1213.     bpl.s    .SubDampX
  1214.     add.w    DampingConstant(a1),d1
  1215.     bra.s    .DampX
  1216. .SubDampX:
  1217.     sub.w    DampingConstant(a1),d1
  1218. .DampX:    move.w    d1,ie_X(a0)
  1219. .SkipX:    move.w    ie_Y(a0),d1
  1220.     bpl.s    .PosY
  1221.     neg.w    d1
  1222. .PosY:    cmp.w    d0,d1
  1223.     bls.s    .EndAccel
  1224.     move.l    AccelOption(a1),a2
  1225.     move.l    (a2),d1
  1226.     muls.w    ie_Y(a0),d1
  1227.     bpl.s    .SubDampY
  1228.     add.w    DampingConstant(a1),d1
  1229.     bra.s    .DampY
  1230. .SubDampY:
  1231.     sub.w    DampingConstant(a1),d1
  1232.  
  1233. .DampY:    move.w    d1,ie_Y(a0)
  1234. .EndAccel:
  1235.  
  1236. .Next:    move.l    a0,d1
  1237.     move.l    (a0),d0
  1238.     move.l    d0,a0
  1239.     bne    .Loop
  1240.  
  1241. ;Check for time-outs (mouse and screen blanking)
  1242.     move.l    d1,a0
  1243.     tst.l    MBlankOption(a1)
  1244.     beq.s    .NoMTime
  1245.     move.l    MBlankOption(a1),a0
  1246.     move.l    (a0),d0    ;get value in seconds
  1247.     move.l    d1,a0
  1248.     move.l    ie_TimeStamp(a0),d1
  1249.     tst.l    MouseTime(a1)
  1250.     beq.s    .InitMBlank
  1251.     sub.l    MouseTime(a1),d1
  1252.     cmp.l    d0,d1    ;TimePassed ? UserSetting
  1253.     blo.s    .NoMTime
  1254.     bsr    BlankMouse
  1255. .NoMTime:
  1256.     tst.l    SBlankOption(a1)
  1257.     beq.s    .End
  1258.     btst    #STB_SBlanked,Status(a1)
  1259.     bne.s    .End
  1260.     push    a0
  1261.     move.l    SBlankOption(a1),a0
  1262.     move.l    (a0),d0    ;get value in seconds
  1263.     pop    a0
  1264.     move.l    ie_TimeStamp(a0),d1
  1265.     tst.l    ScreenTime(a1)
  1266.     beq.s    .InitSBlank
  1267.     sub.l    ScreenTime(a1),d1
  1268.     cmp.l    d0,d1    ;TimePassed ? UserSetting
  1269.     blo.s    .End
  1270.     move.w    #DMAF_COPPER+DMAF_RASTER,dmacon+_custom
  1271.     clr.w    color+_custom
  1272.     bset    #STB_SBlanked,Status(a1)
  1273.  
  1274. .End:    move.l    (sp)+,d0
  1275.     bsr    FreeSemaphore
  1276.     movem.l    (sp)+,a2/a6
  1277.     rts
  1278. .InitMBlank:
  1279.     move.l    ie_TimeStamp(a0),MouseTime(a1)
  1280.     bra    .NoMTime
  1281. .InitSBlank:
  1282.     move.l    ie_TimeStamp(a0),ScreenTime(a1)
  1283.     bra    .End
  1284.  
  1285. GlobalPtr:
  1286.     dc.l    0
  1287.  
  1288. NorthgateTable:
  1289.     dc.b    $6b,$4f,IEQUALIFIERB_LSHIFT
  1290.     dc.b    $6c,$4e,IEQUALIFIERB_LSHIFT
  1291.     dc.b    $6d,$4c,IEQUALIFIERB_LSHIFT
  1292.     dc.b    $6e,$4d,IEQUALIFIERB_LSHIFT
  1293.     dc.b    0
  1294.  
  1295. ProcName:    dc.b    'QMouse process',0
  1296. InputName:
  1297.     dc.b    'input.device',0
  1298. TrackName:
  1299.     dc.b    'trackdisk.device',0
  1300.     even
  1301.  
  1302. EndAllocCode:    ;end of code copied into allocated memory
  1303. ;***********************************************************************
  1304.  
  1305. NewProcTags:
  1306.     dc.l    NP_Entry
  1307. EntryPoint:
  1308.     dc.l    0
  1309.     dc.l    NP_Name
  1310. ProcNamePtr:
  1311.     dc.l    0
  1312.     dc.l    NP_Cli,-1
  1313.     dc.l    0    ;end of tags
  1314.  
  1315. Template:    dc.b    'M=MBLANK/K/N,'
  1316.     dc.b    'S=SBLANK/K/N,'
  1317.     dc.b    'N=NOFLICKER/S,'
  1318.     dc.b    'CMD/K,'
  1319.     dc.b    'A=ACCELERATION/K/N,'
  1320.     dc.b    'T=THRESHOLD/K/N,'
  1321.     dc.b    'CTB=CLICKTOBACK/S,'
  1322.     dc.b    'CTF=CLICKTOFRONT/K/N,'
  1323.     dc.b    'SUNMOUSE/S,'
  1324.     dc.b    'NORTHGATE/S,'
  1325.     dc.b    'NOBEEP/S,'
  1326.     dc.b    'NOCLICK/K/N,'
  1327.     dc.b    'VERIFY/S,'
  1328.     dc.b    'STAR/S,'
  1329.     dc.b    'QUIT/S',0
  1330.  
  1331. IntName:    dc.b    'intuition.library',0
  1332. GraphName:
  1333.     dc.b    'graphics.library',0
  1334. DosName:    dc.b    'dos.library',0
  1335. LayersName:
  1336.     dc.b    'layers.library',0
  1337.  
  1338. ;The ordering here is special: data registers first, then address
  1339. ;registers, so that MOVEM may be used to save/restore the data.
  1340.  
  1341.     STRUCTURE    pt,0
  1342.     LONG    pt_Height
  1343.     LONG    pt_Width
  1344.     LONG    pt_XOffset
  1345.     LONG    pt_YOffset
  1346.     LONG    pt_Window
  1347.     LONG    pt_Pointer
  1348.     LABEL    pt_Sizeof
  1349.  
  1350. ResidentCodeSize    equ    EndAllocCode-StartAllocCode
  1351.  
  1352.     STRUCTURE    Data,0
  1353.     WORD    Nothing    ;to make zero special
  1354.     LONG    Task
  1355.     LONG    InputMsgPort
  1356.     LONG    InputIORequest
  1357.     STRUCT    InputInterrupt,IS_SIZE
  1358.     LONG    IntBase
  1359.     LONG    GraphBase
  1360.     LONG    LayersBase
  1361.     STRUCT    ScreenList,SCREENLISTSIZE*8
  1362.     STRUCT    PointerList,POINTERLISTSIZE*pt_Sizeof
  1363.     LONG    OldCloseScreen
  1364.     LONG    OldCloseWindow
  1365.     LONG    OldScreenToFront
  1366.     LONG    OldScreenToBack
  1367.     LONG    OldOpenScreen
  1368.     LONG    OldOpenScreenTagList
  1369.     LONG    OldWBenchToFront
  1370.     LONG    OldWBenchToBack
  1371.     LONG    OldLoadView
  1372.     LONG    OldSetPointer
  1373.     LONG    OldClearPointer
  1374.     LONG    OldDisplayBeep
  1375.     LONG    DosBase
  1376.     LONG    ArgPtr
  1377.     STRUCT    ResidentCode,ResidentCodeSize
  1378.     LONG    MouseTime    ;timeout for mouse blanking
  1379.     LONG    ScreenTime    ;for screen blanking
  1380.     LONG    MBlankWindow
  1381.     WORD    DampingConstant
  1382.     STRUCT    MySemaphore,SS_SIZE
  1383.     LONG    ClickWindow
  1384.     STRUCT    ClickTime,TV_SIZE
  1385.     LONG    ClickCount
  1386.     LONG    Path
  1387.     LONG    ChipData
  1388.     LONG    RealBackground
  1389.     LONG    OriginalCopInit
  1390.     LONG    ScreenPtr
  1391.     WORD    CurrentX
  1392.     WORD    CurrentY
  1393.  
  1394.     LABEL    Sigs
  1395.     LONG    CLISig
  1396.     LONG    QuitSig
  1397.     LONG    ScreenToBackSig
  1398.     LONG    WBenchToFrontSig
  1399.     LABEL    EndSigs
  1400.  
  1401.     LABEL    Options
  1402.     LONG    MBlankOption
  1403.     LONG    SBlankOption
  1404.     LONG    FlickerOption
  1405.     LONG    CmdOption
  1406.     LONG    AccelOption
  1407.     LONG    ThreshOption
  1408.     LONG    CTBOption
  1409.     LONG    CTFOption
  1410.     LONG    SunMouseOption
  1411.     LONG    NorthGateOption
  1412.     LONG    BeepOption
  1413.     LONG    NoClickOption
  1414.     LONG    VerifyOption
  1415.     LONG    StarOption
  1416.     LONG    QuitOption
  1417.  
  1418.     BYTE    HandlerInstalled
  1419.     BYTE    Status    ;various status bits (defined below)
  1420.     LABEL    Data_Sizeof
  1421.  
  1422. ;Bit definitions for Status
  1423.     BITDEF    ST,SBlanked,0
  1424.     BITDEF    ST,SunMouse,1
  1425.  
  1426. NumSigs    equ    (EndSigs-Sigs)/4
  1427.  
  1428.     STRUCTURE    CData,0
  1429.     STRUCT    ZeroMouse,12
  1430.     STRUCT    Copper,MaxCopperSize+4*4
  1431.     LABEL    CData_Sizeof
  1432.  
  1433.     end
  1434.